#ifndef BERTH_H
#define BERTH_H

#include <iostream>
#include "global.h"

// 泊位，大小4*4
struct Berth{
    Point p; // 左上角坐标
    int idx; // 港口编号
    int transport_time;  // 到虚拟点时间
    int loading_speed;   // 每帧装货数量

    float score;       // 打分，绑定机器人时候用

    int currentcargo; // 当前货物数量
    float avgcargo;   // 货物数/时间，用于船选择合适的港口 

    int boatcoming; // 是否有船正在驶来
    bool close;     // 港口关闭

    int totalcargo; // 总的货物数量，用于调试
    int misscargo;  // 机器人空跑的次数，用于调试
    Berth():score(0), totalcargo(0), misscargo(0), close(true){}
    // Berth(int x, int y, int transport_time, int loading_speed):
    //     p(x, y), transport_time(transport_time), loading_speed(loading_speed){}

    std::set<Cargo, CargoCompare> cargo_set;

    friend std::istream& operator>>(std::istream& in, Berth& berth){
        in >> berth.p >> berth.transport_time >> berth.loading_speed;
        return in;
    }

    friend std::ostream& operator<<(std::ostream& out, Berth& berth){
        out << "[berth(" << berth.p << "), transport_time: " << berth.transport_time << ", loading_speed: " << berth.loading_speed << ", score:" << berth.score <<  "]";
        return out;
    }
 
    void SetScore();    // 港口评分，用于绑定机器人
    void UpdateScore(); // 有新的机器人绑定港口
};

struct BerthCompare {
    bool operator()(const Berth* a, const Berth* b) {
        return a->score < b->score;
    }
};

struct BerthCargoCompare {
    bool operator()(const Berth* a, const Berth* b) {
        return a->currentcargo < b->currentcargo;
    }
};

// 船，大小2*4
struct Boat{
    int status; // 0 表示移动(运输)中, 1 表示正常运行状态, 2 表示泊位外等待状态
    int pos;    // 表示目标泊位，如果目标泊位是虚拟点，则为-1

    bool which; // 每个船管两个泊位，这个变量表示下次去哪个
    int wait;   // 在泊位中等待时间
 
    friend std::istream& operator>>(std::istream& in, Boat& boat){
        in >> boat.status >> boat.pos;
        return in;
    }

    friend std::ostream& operator<<(std::ostream& out, Boat& boat){
        out << "[boat(" << boat.pos << "), status: " << boat.status<< "]";
        return out;
    }

    void GoToBerth(int i); // 选择要去的港口
    void Deliver(int i);      // 装货
};

#endif // !BERTH_H